home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / bin / scsi_logging_level < prev    next >
Text File  |  2008-05-03  |  8KB  |  267 lines

  1. #! /bin/bash
  2. ###############################################################################
  3. # Conveniently create and set scsi logging level, show SCSI_LOG fields in human
  4. # readable form.
  5. #
  6. # (C) Copyright IBM Corp. 2006
  7. ###############################################################################
  8.  
  9.  
  10. REVISION="1.0"
  11. SCRIPTNAME="scsi_logging_level"
  12.  
  13. declare -i LOG_ERROR=0
  14. declare -i LOG_TIMEOUT=0
  15. declare -i LOG_SCAN=0
  16. declare -i LOG_MLQUEUE=0
  17. declare -i LOG_MLCOMPLETE=0
  18. declare -i LOG_LLQUEUE=0
  19. declare -i LOG_LLCOMPLETE=0
  20. declare -i LOG_HLQUEUE=0
  21. declare -i LOG_HLCOMPLETE=0
  22. declare -i LOG_IOCTL=0
  23.  
  24. declare -i LEVEL=0
  25.  
  26. SET=0
  27. GET=0
  28. CREATE=0
  29.  
  30. OPTS=`getopt -o hvcgsa:E:T:S:I:M:L:H: --long \
  31. help,version,create,get,set,all:,error:,timeout:,scan:,ioctl:,\
  32. midlevel:,mlqueue:,mlcomplete:,lowlevel:,llqueue:,llcomplete:,\
  33. highlevel:,hlqueue:,hlcomplete: -n \'$SCRIPTNAME\' -- "$@"`
  34. eval set -- "$OPTS"
  35.  
  36. # print version info
  37. printversion()
  38. {
  39.     cat <<EOF
  40. %S390_TOOLS_VERSION% ($SCRIPTNAME $REVISION)
  41. (C) Copyright IBM Corp. 2006
  42. EOF
  43. }
  44.  
  45. # print usage and help
  46. printhelp()
  47. {
  48.     cat <<EOF
  49. Usage: $SCRIPTNAME [OPTIONS]
  50.  
  51. Create, get or set scsi logging level.
  52.  
  53. Options:
  54.  
  55.         -h, --help       print this help
  56.         -v, --version    print version information
  57.         -s, --set        create and set logging level as specified on
  58.                          command line
  59.         -g, --get        get current logging level and display it
  60.         -c, --create     create logging level as specified on command line
  61.         -a, --all        specify value for all SCSI_LOG fields
  62.         -E, --error      specify SCSI_LOG_ERROR
  63.         -T, --timeout    specify SCSI_LOG_TIMEOUT
  64.         -S, --scan       specify SCSI_LOG_SCAN
  65.         -M, --midlevel   specify SCSI_LOG_MLQUEUE and SCSI_LOG_MLCOMPLETE
  66.             --mlqueue    specify SCSI_LOG_MLQUEUE
  67.             --mlcomplete specify SCSI_LOG_MLCOMPLETE
  68.         -L, --lowlevel   specify SCSI_LOG_LLQUEUE and SCSI_LOG_LLCOMPLETE
  69.             --llqueue    specify SCSI_LOG_LLQUEUE
  70.             --llcomplete specify SCSI_LOG_LLCOMPLETE
  71.         -H, --highlevel  specify SCSI_LOG_HLQUEUE and SCSI_LOG_HLCOMPLETE
  72.             --hlqueue    specify SCSI_LOG_HLQUEUE
  73.             --hlcomplete specify SCSI_LOG_HLCOMPLETE
  74.         -I, --ioctl      specify SCSI_LOG_IOCTL
  75.  
  76. Exactly one of the options "-c", "-g" and "-s" has to be specified.
  77. Valid values for SCSI_LOG fields are integers from 0 to 7.
  78.  
  79. Note: Several SCSI_LOG fields can be specified using several options.
  80. When multiple options specify same SCSI_LOG field the most specific
  81. option has precedence.
  82.  
  83. Example: "scsi_logging_level --hlqueue 3 --highlevel 2 --all 1 -s" sets
  84. SCSI_LOG_HLQUEUE=3, SCSI_LOG_HLCOMPLETE=2 and assigns all other SCSI_LOG
  85. fields the value 1.
  86. EOF
  87. }
  88.  
  89. check_level()
  90. {
  91.     if [ `echo -n $1 | tr --complement [:digit:] 'a' | grep -s 'a'` ]
  92.     then
  93.     invalid_cmdline "log level '$1' out of range [0, 7]"
  94.     fi
  95.     
  96.     if [ $1 -lt 0 -o $1 -gt 7 ]
  97.     then
  98.     invalid_cmdline "log level '$1' out of range [0, 7]"
  99.     fi
  100. }
  101.  
  102. # check cmd line arguments
  103. check_cmdline()
  104. {
  105.     while true ; do
  106.     case "$1" in
  107.         -a|--all)    _ALL=$2; check_level $2
  108.             shift 2;;
  109.         -c|--create) CREATE=1;
  110.             shift 1;;
  111.         -g|--get)    GET=1
  112.             shift 1;;
  113.         -h|--help) printhelp
  114.             exit 0;;
  115.         -s|--set)    SET=1
  116.             shift 1;;
  117.         -v|--version) printversion
  118.             exit 0;;
  119.         -E|--error)    _ERROR=$2; check_level $2
  120.             shift 2;;
  121.         -T|--timeout) _TIMEOUT=$2; check_level $2
  122.             shift 2;;
  123.         -S|--scan)    _SCAN=$2; check_level $2
  124.             shift 2;;
  125.         -M|--midlevel) _ML=$2; check_level $2
  126.             shift 2;;
  127.         --mlqueue)    _MLQUEUE=$2; check_level $2
  128.             shift 2;;
  129.         --mlcomplete) _MLCOMPLETE=$2; check_level $2
  130.             shift 2;;
  131.         -L|--lowlevel) _LL=$2; check_level $2
  132.             shift 2;;
  133.         --llqueue)    _LLQUEUE=$2; check_level $2
  134.             shift 2;;
  135.         --llcomplete) _LLCOMPLETE=$2; check_level $2
  136.             shift 2;;
  137.         -H|--highlevel) _HL=$2; check_level $2
  138.             shift 2;;
  139.         --hlqueue)    _HLQUEUE=$2; check_level $2
  140.             shift 2;;
  141.         --hlcomplete) _HLCOMPLETE=$2; check_level $2
  142.             shift 2;;
  143.         -I|--ioctl) _IOCTL=$2; check_level $2
  144.             shift 2;;
  145.         --) shift; break;;
  146.         *) echo "Internal error!" ; exit 1;;
  147.     esac
  148.     done
  149.  
  150.     if [ -n "$*" ]
  151.     then
  152.     invalid_cmdline invalid parameter $*
  153.     fi
  154.  
  155.     if [ $GET = "1" -a $SET = "1" ]
  156.     then
  157.         invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive
  158.     elif [ $GET = "1" -a $CREATE = "1" ]
  159.     then
  160.         invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive
  161.     elif [ $SET = "1" -a $CREATE = "1" ]
  162.     then
  163.         invalid_cmdline options \'-c\', \'-g\' and \'-s\' are mutual exclusive
  164.     fi
  165.     
  166.     LOG_ERROR=${_ERROR:-${_ALL:-0}}
  167.     LOG_TIMEOUT=${_TIMEOUT:-${_ALL:-0}}
  168.     LOG_SCAN=${_SCAN:-${_ALL:-0}}
  169.     LOG_MLQUEUE=${_MLQUEUE:-${_ML:-${_ALL:-0}}}
  170.     LOG_MLCOMPLETE=${_MLCOMPLETE:-${_ML:-${_ALL:-0}}}
  171.     LOG_LLQUEUE=${_LLQUEUE:-${_LL:-${_ALL:-0}}}
  172.     LOG_LLCOMPLETE=${_LLCOMPLETE:-${_LL:-${_ALL:-0}}}
  173.     LOG_HLQUEUE=${_HLQUEUE:-${_HL:-${_ALL:-0}}}
  174.     LOG_HLCOMPLETE=${_HLCOMPLETE:-${_HL:-${_ALL:-0}}}
  175.     LOG_IOCTL=${_IOCTL:-${_ALL:-0}}
  176. }
  177.  
  178. invalid_cmdline()
  179. {
  180.         echo "$SCRIPTNAME: $*"
  181.     echo "$SCRIPTNAME: Try '$SCRIPTNAME --help' for more information."
  182.     exit 1
  183. }
  184.  
  185. get_logging_level()
  186. {
  187.     echo "Current scsi logging level:"
  188.     LEVEL=`sysctl -n dev.scsi.logging_level`
  189.     if [ $? != 0 ]
  190.     then
  191.      echo "$SCRIPTNAME: could not read scsi logging level" \
  192.              "(kernel probably without SCSI_LOGGING support)"
  193.      exit 1
  194.     fi
  195. }
  196.  
  197. show_logging_level()
  198. {
  199.     echo "dev.scsi.logging_level = $LEVEL"
  200.  
  201.     LOG_ERROR=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
  202.     LOG_TIMEOUT=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
  203.     LOG_SCAN=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
  204.     LOG_MLQUEUE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
  205.     LOG_MLCOMPLETE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
  206.     LOG_LLQUEUE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
  207.     LOG_LLCOMPLETE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3))
  208.     LOG_HLQUEUE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3));
  209.     LOG_HLCOMPLETE=$(($LEVEL & 7)); LEVEL=$(($LEVEL>>3));
  210.     LOG_IOCTL=$(($LEVEL & 7))
  211.  
  212.     echo "SCSI_LOG_ERROR=$LOG_ERROR"
  213.     echo "SCSI_LOG_TIMEOUT=$LOG_TIMEOUT"
  214.     echo "SCSI_LOG_SCAN=$LOG_SCAN"
  215.     echo "SCSI_LOG_MLQUEUE=$LOG_MLQUEUE"
  216.     echo "SCSI_LOG_MLCOMPLETE=$LOG_MLCOMPLETE"
  217.     echo "SCSI_LOG_LLQUEUE=$LOG_LLQUEUE"
  218.     echo "SCSI_LOG_LLCOMPLETE=$LOG_LLCOMPLETE"
  219.     echo "SCSI_LOG_HLQUEUE=$LOG_HLQUEUE"
  220.     echo "SCSI_LOG_HLCOMPLETE=$LOG_HLCOMPLETE"
  221.     echo "SCSI_LOG_IOCTL=$LOG_IOCTL"
  222. }
  223.  
  224. set_logging_level()
  225. {
  226.     echo "New scsi logging level:"
  227.     sysctl -q -w dev.scsi.logging_level=$LEVEL
  228.     if [ $? != 0 ]
  229.     then
  230.      echo "$SCRIPTNAME: could not write scsi logging level" \
  231.           "(kernel probably without SCSI_LOGGING support)"
  232.      exit 1
  233.     fi
  234. }
  235. create_logging_level()
  236. {
  237.     LEVEL=$(($LOG_IOCTL & 7)); LEVEL=$(($LEVEL<<3))
  238.     LEVEL=$(($LEVEL|($LOG_HLCOMPLETE & 7))); LEVEL=$(($LEVEL<<3))
  239.     LEVEL=$(($LEVEL|($LOG_HLQUEUE & 7))); LEVEL=$(($LEVEL<<3))
  240.     LEVEL=$(($LEVEL|($LOG_LLCOMPLETE & 7))); LEVEL=$(($LEVEL<<3))
  241.     LEVEL=$(($LEVEL|($LOG_LLQUEUE & 7))); LEVEL=$(($LEVEL<<3))
  242.     LEVEL=$(($LEVEL|($LOG_MLCOMPLETE & 7))); LEVEL=$(($LEVEL<<3))
  243.     LEVEL=$(($LEVEL|($LOG_MLQUEUE & 7))); LEVEL=$(($LEVEL<<3))
  244.     LEVEL=$(($LEVEL|($LOG_SCAN & 7))); LEVEL=$(($LEVEL<<3))
  245.     LEVEL=$(($LEVEL|($LOG_TIMEOUT & 7))); LEVEL=$(($LEVEL<<3))
  246.     LEVEL=$(($LEVEL|($LOG_ERROR & 7)))
  247. }
  248.  
  249. check_cmdline $*
  250.  
  251. if [ $SET = "1" ]
  252. then
  253.     create_logging_level
  254.     set_logging_level
  255.     show_logging_level
  256. elif [ $GET = "1" ]
  257. then
  258.     get_logging_level
  259.     show_logging_level
  260. elif [ $CREATE = "1" ]
  261. then
  262.     create_logging_level
  263.     show_logging_level
  264. else
  265.     invalid_cmdline missing option \'-g\', \'-s\' or \'-c\'
  266. fi
  267.